Приложение
==========

Объект приложения (application) инкапсулирует контекст выполнения запроса.
Основная задача приложения — собрать информацию о запросе и передать
её соответствующему контроллеру для дальнейшей обработки. Также приложение
является централизованным хранилищем конфигурации приложения. Именно поэтому объект
приложения также называют `фронт-контроллером`.

Объект приложения создаётся [входным скриптом](/doc/guide/basics.entry) как `одиночка (singleton)`.
Экземпляр приложения доступен из любой его точки посредством [Yii::app()|YiiBase::app].


Конфигурация приложения
-----------------------
По умолчанию объект приложения — это экземпляр класса [CWebApplication], который
может быть настроен с использованием конфигурационного файла (или массива).
Необходимые значения свойств устанавливаются в момент создания экземпляра приложения.
Альтернативный путь настройки приложения — расширение класса [CWebApplication].

Конфигурация — это массив пар ключ-значение, где каждый ключ представляет собой
имя свойства экземпляра приложения, а значение — начальное значение соответствующего свойства.
Например, следующая конфигурация устанавливает значения свойств приложения
[name|CApplication::name] и [defaultController|CWebApplication::defaultController]:

~~~
[php]
array(
	'name'=>'Yii Framework',
	'defaultController'=>'site',
)
~~~

Стоит отметить, что приложение, как и большинство классов Yii, [является компонентом](/doc/guide/basics.component).
Это означает что:

- Вы не можете присваивать значения не объявленным в классе свойствам.
- Приложение поддерживает свойства, объявленные через геттеры и сеттеры, то есть можно сконфигурировать свойство, заданное
[setImport|CModule::setImport] следующим образом:

~~~
[php]
array(
	'import'=>array(
		'application.components.*',
	),
)
~~~

Обычно конфигурация хранится в отдельном PHP-скрипте
(например, `protected/config/main.php`). Скрипт возвращает конфигурационный массив:

~~~
[php]
return array(…);
~~~

Чтобы воспользоваться конфигурацией, необходимо передать имя конфигурационного
файла в качестве аргумента конструктору приложения или методу
[Yii::createWebApplication()], как показано ниже.
Обычно это делается во [входном скрипте](/doc/guide/basics.entry):

~~~
[php]
$app=Yii::createWebApplication($configFile);
~~~

> Tip|Подсказка: Если конфигурация очень громоздкая, можно разделить ее на несколько файлов,
каждый из которых возвращает часть конфигурационного массива. Затем в основном конфигурационном
файле необходимо подключить эти файлы, используя `include()`, и соединить массивы-части в единый
конфигурационный массив.


Базовая директория приложения
-----------------------------
Базовой директорией приложения называется корневая директория, содержащая все основные, с точки
зрения безопасности, PHP-скрипты и данные. По умолчанию это поддиректория `protected`, находящаяся
в директории, содержащей входной скрипт. Изменить её местоположение можно, установив свойство
[basePath|CWebApplication::basePath] в [конфигурации приложения](/doc/guide/basics.application#application-configuration).

Содержимое базовой директории должно быть закрыто от доступа из веб.
При использовании веб-сервера [Apache HTTP server](http://httpd.apache.org/)
это можно сделать путем добавления в базовую директорию файла `.htaccess` следующего содержания:

~~~
deny from all
~~~


Компоненты приложения
---------------------

Функциональность объекта приложения может быть легко модифицирована и расширена благодаря компонентной архитектуре.
Приложение управляет набором компонентов, каждый из которых реализует набор определённых возможностей.
Например, приложение производит предварительную обработку запроса пользователя, используя компоненты [CUrlManager] и [CHttpRequest].

Изменяя значение свойства [components|CApplication::components], можно настроить классы и [значения свойств](/doc/guide/basics.component)
любого компонента, используемого приложением. Например, можно сконфигурировать компонент [CMemCache] так, чтобы
он использовал несколько memcache-серверов для кэширования:

~~~
[php]
array(
	…
	'components'=>array(
		…
		'cache'=>array(
			'class'=>'CMemCache',
			'servers'=>array(
				array('host'=>'server1', 'port'=>11211, 'weight'=>60),
				array('host'=>'server2', 'port'=>11211, 'weight'=>40),
			),
		),
	),
)
~~~

В данном примере мы добавили элемент `cache` к массиву `components`.
Элемент `cache` указывает, что классом компонента является [CMemCache], а также устанавливает его свойство
[servers|CMemcache::servers].

Для доступа к компоненту приложения используйте `Yii::app()->ComponentID`, где
`ComponentID` — это идентификатор компонента (например, `Yii::app()->cache`).

Компонент может быть деактивирован путем установки параметра `enabled` в его конфигурации равным false.
При обращении к деактивированному компоненту будет возвращен null.

> Tip|Подсказка: По умолчанию компоненты приложения создаются по требованию.
Это означает, что экземпляр компонента может быть не создан вообще в случае,
если это не требуется при обработке пользовательского запроса. В результате общая
производительность приложения может не пострадать, даже если в конфигурации
указано множество компонентов.


При необходимости обязательного создания экземпляров компонентов (например, [CLogRouter])
вне зависимости от того, используются они или нет, укажите их идентификаторы в
значении конфигурационного свойства [preload|CApplication::preload].

Ключевые компоненты приложения
------------------------------
Yii предопределяет набор компонентов ядра, которые предоставляют возможности,
необходимые для большинства веб-приложений. Например, компонент [request|CWebApplication::request]
используется для сбора информации о запросе пользователя и предоставляет
различную информацию, такую как URL и cookies. Задавая свойства компонентов,
можно изменять стандартное поведение Yii практически как угодно.

Далее перечислены ключевые компоненты, предопределенные классом [CWebApplication]:

   - [assetManager|CWebApplication::assetManager]: [CAssetManager] — управляет публикацией файлов ресурсов (asset files);

   - [authManager|CWebApplication::authManager]: [CAuthManager] — контролирует доступ на основе ролей (RBAC);

   - [cache|CApplication::cache]: [CCache] — предоставляет возможности кэширования данных; учтите, что вы
должны указать используемый класс (например, [CMemCache], [CDbCache]), иначе при обращении к компоненту будет возвращен null;

   - [clientScript|CWebApplication::clientScript]: [CClientScript] — управляет клиентскими скриптами (JavaScript и CSS);

   - [coreMessages|CApplication::coreMessages]: [CPhpMessageSource] — предоставляет переводы системных сообщений Yii-фреймворка;

   - [db|CApplication::db]: [CDbConnection] — обслуживает соединение с базой данных; обратите внимание, что
для использования компонента необходимо установить свойство [connectionString|CDbConnection::connectionString];

   - [errorHandler|CApplication::errorHandler]: [CErrorHandler] — обрабатывает не пойманные ошибки и исключения PHP;

   - [format|CApplication::format]: [CFormatter] — форматирует данные для их последующего отображения.

   - [messages|CApplication::messages]: [CPhpMessageSource] — предоставляет переводы сообщений, используемых в Yii-приложении;

   - [request|CWebApplication::request]: [CHttpRequest] — содержит информацию о пользовательском запросе;

   - [securityManager|CApplication::securityManager]: [CSecurityManager] — предоставляет функции,
   связанные с безопасностью (например, хеширование, шифрование);

   - [session|CWebApplication::session]: [CHttpSession] — обеспечивает функциональность, связанную с сессиями;

   - [statePersister|CApplication::statePersister]: [CStatePersister] — предоставляет метод для сохранения
глобального состояния;

   - [urlManager|CWebApplication::urlManager]: [CUrlManager] — предоставляет функции парсинга и формирования URL;

   - [user|CWebApplication::user]: [CWebUser] — предоставляет идентификационную информацию текущего пользователя;

   - [themeManager|CWebApplication::themeManager]: [CThemeManager] — управляет темами оформления.


Жизненный цикл приложения
-------------------------
Жизненный цикл приложения при обработке пользовательского запроса выглядит следующим образом:

   0. Предварительная инициализация приложения через [CApplication::preinit()].

   1. Инициализация обработчика ошибок.

   2. Регистрация компонентов ядра.

   3. Загрузка конфигурации приложения.

   4. Инициализация приложения [CApplication::init()]:
      - регистрация поведений приложения;
      - загрузка статических компонентов приложения.

   5. Вызов события [onBeginRequest|CApplication::onBeginRequest].

   6. Обработка запроса:
      - сбор информации о запросе;
      - создание контроллера;
      - запуск контроллера.

   7. Вызов события [onEndRequest|CApplication::onEndRequest].